﻿var qxDebug = false;
if(!qxDebug)qx.dev.log.Logger.ROOT_LOGGER.removeAllAppenders();
/**
---------------------------------
tableUtil
---------------------------------
*/
TableUtil = {};
TableUtil.getFirstSeletedRowIndexes = function(table){
	var selectionModel = table.getSelectionModel();
	var selectedRangeArr = selectionModel._selectedRangeArr;
	var selectedRows = [];
	for(var i = 0; i < selectedRangeArr.length; i++){
		var range = selectedRangeArr[i];
		for(var j = range.minIndex; j <= range.maxIndex; j++){
			selectedRows.push(j);
		}
	}
	return selectedRows;
}
/**
---------------------------------
ListViewUtil
---------------------------------
*/
/**
 * 为了方便使用我将几个对listView操作的方法抽了出来。
 */
function ListViewUtil(){};
/**
 * 新增条目，焦点设在新增的条目上。
 * vItems应该是数组。
 */
ListViewUtil.addItems = function(lv/** QxListView */,vItems){
	       var ld = lv.getData();
	       for(var i = 0; i < vItems.length; i++){
		     ld.push(vItems[i]);
		   }
		   lv.updateSort();
		   lv.update();
		   lv.getPane().getManager().setSelectedItems(vItems);
		   ListViewUtil.changeScrollTopBySelectedItem(lv);
};
ListViewUtil.refresh = function(lv){
            var scrollTop = lv.getPane().getScrollTop();
            lv.update();
            lv.getPane().setScrollTop(scrollTop);  
}
/**
 * vItem这条记录现在是否可以看到。
 */
ListViewUtil.isVisible = function(lv,vItem){
	var pane = lv.getPane();
  var vIndex = pane.getData().indexOf(vItem);
  
  var vRowStart = Math.floor(pane.getScrollTop() / pane.getItemHeight());
  var vRowLength = Math.floor(pane.getClientHeight() / pane.getItemHeight() + 0.5);
  if(vIndex < vRowStart)return -1;
  if(vIndex > (vRowStart + vRowLength -1))return -2;
  return 1;
};
/**
 * 选中位置上移。
 * topHandler是指当上移越界的处理函数。
 */
ListViewUtil.selectionUp = function(lv,handlers){
	    var pane = lv.getPane();
        var selectedItem = 	pane.getSelectedItem();//==pane.getManager().getSelectedItem()
        var ld = lv.getData();
        if(ld.length == 0)return;
        if(selectedItem == null){
        	index = ld.length-1;
        }else{
	        var index = ld.indexOf(selectedItem);
	        index--;        	
        }

        if(index>-1){
          pane.getManager().setSelectedItems([ld[index]]);
		  if(handlers != null && handlers.changeSelectionHandler != null)
				ListViewUtil.changeScrollTopBySelectedItem(lv,handlers.changeSelectionHandler);
		  else
				ListViewUtil.changeScrollTopBySelectedItem(lv);
        }else{
        	pane.debug("到头了");
		    if(handlers != null && handlers.overHandler != null && typeof handlers.overHandler == 'function'){
		      handlers.overHandler(lv);
			}
        }
};
/**
 * 选中位置下移。
 * tailHandler是指当下移越界的处理函数。
 */
ListViewUtil.selectionDown = function(lv,handlers){
	      var pane = lv.getPane();
        var selectedItem = 	pane.getSelectedItem();//==pane.getManager().getSelectedItem()
        var ld = lv.getData();
        if(ld.length == 0)return;
        if(selectedItem == null)selectedItem = ld[0];
        var index = ld.indexOf(selectedItem);
        index++;
        if(index<ld.length)
        {
        	pane.getManager().setSelectedItems([ld[index]]);
		  if(handlers != null && handlers.changeSelectionHandler != null)
				ListViewUtil.changeScrollTopBySelectedItem(lv,handlers.changeSelectionHandler);
		  else
				ListViewUtil.changeScrollTopBySelectedItem(lv);
        }else{
        	pane.debug("到底了");
          if(handlers != null && handlers.overHandler != null && typeof handlers.overHandler == "function"){handlers.overHandler(lv)}
        }
};
/**
 * 根据选中项目的位置来调整滚动条的位置。
 *
 */
ListViewUtil.changeScrollTopBySelectedItem = function(lv,changeSelectionHandler){
	var pane = lv.getPane();
	var selectedItem = pane.getSelectedItem();
	if(selectedItem == null)return;
	var index = lv.getData().indexOf(selectedItem);
	var posStatus = ListViewUtil.isVisible(lv,selectedItem);
	if(posStatus == -1){
	  pane.setScrollTop(index*pane.getItemHeight());
	}else if(posStatus == -2){
	  var vRowLength = Math.floor(pane.getClientHeight() / pane.getItemHeight()-0.5);
	  pane.setScrollTop((index-vRowLength)*pane.getItemHeight());
	}
	if(changeSelectionHandler != null)changeSelectionHandler(lv);
};
ListViewUtil.searchItem = function(lv,id){
  var rtns = ListViewUtil.searchItems(lv,id);
  if(rtns.length == 0)return null;
  return rtns[0];
};
/**
 * 根据输入的对象，来查找具有相同值的对象。
 */
ListViewUtil.searchItems = function(lv,id){
	var ld = lv.getData();
	var rtn = [];
	for(var i=0; i<ld.length; i++) {
		var item = ld[i];
		var equal = true;
		for(var key in id){
			if(item[key] != id[key]){
				equal = false;
				break;
			}
		}
		if(equal){
			rtn.push(item);
		}
	}
	return rtn;
};

/**
------------------------------------
QxGridLayoutUtil 为使用QxGridLayout节省一些代码
-----------------------------------
*/
QxGridLayoutUtil = function(){};
QxGridLayoutUtil.setColsWidth = function(gl,widths){
  for(var i = 0; i < widths.length; i++){
     gl.setColumnWidth(i, widths[i]);
  }
};
QxGridLayoutUtil.setRowsHeight = function(gl,heights){
  for(var i = 0; i < heights.length; i++){
     gl.setRowHeight(i, heights[i]);
  }
};
QxGridLayoutUtil.fillGrid = function(gl,eless){
  for(var i = 0; i < eless.length; i++){
	  var eles = eless[i];
	  for(var j = 0; j < eles.length; j++){
		  var ele = eles[j];
		  if(ele != null)gl.add(ele,j,i);
	  }
  }
};
/**
---------------------------------
ComboBox
---------------------------------
*/
ComboBoxUtil = function(){};
ComboBoxUtil.getItemByLabel = function(vComboBox,vLabel){
	var itemList = vComboBox.getList().getChildren();
  	if(itemList != null){
  		var matched = false;
  		for(var x = 0; x < itemList.length; x++){
  			var itemx = itemList[x];
  			var labelx = itemx.getLabel();
  			if(labelx == vLabel){
  				return itemx;
  			}
  		}
  	}
  	return null;
};
ComboBoxUtil.getItemByValue = function(vValue){
	var itemList = vComboBox.getList().getChildren();
  	if(itemList != null){
  		var matched = false;
  		for(var x = 0; x < itemList.length; x++){
  			var itemx = itemList[x];
  			var valuex = itemx.getValue();
  			if(valuex == vValue){
  				return itemx;
  			}
  		}
  	}
  	return null;
};
/**
---------------------------------
FormManager
几点说明，
1、对于Radio，你应该使用QxRadioManager，
然后将QxRadioManager放到FormManager里而不是将Radio放到FormManager里。
关于QxRadioManager的用法可以参考/demo/example/RadioButton_1.html
2、对于checkbox现在我还没成熟的想法
---------------------------------
*/
FormManager = function(){
  this.formElements = {};//每个元素都是数组
};
//FormManager.prototype.getValue = function(vName){
//	if(){
		
//	}
//}
/**
 * 如果不存在返回null。
 * 如果多个同名，则返回数组。
 * 如果存在且只有一个返回他的value。
 */
FormManager.prototype.getValue = function(vName){
	var eles = this.formElements[vName];
	if(eles != null){
		var values = [];
		for(var i = 0; i < eles.length; i++){
			var ele = eles[i];
			var v = null;
			if(ele.classname.indexOf('CheckBox') > -1){
				if(!ele.getChecked())continue;
				v = ele.getValue();
		    }else if(ele.classname.indexOf('RadioManager') > -1){
			  v = ele.getSelected().getValue();
			}else if(ele.classname.indexOf('ComboBox') > -1){
			  if(ele.getSelected() != null){
			    v = ele.getSelected().getValue();
			    if(v == null)ele.getSelected().getLabel();
			  }else{
			    v = ele.getValue();
			  }
            }else{
            	v = ele.getValue();
            }
            values.push(v);
            
			
		}
		if(values.length == 1)return values[0];
		if(values.length > 1)return values;
	}
	return null;
};
FormManager.prototype.clear = function(){
	for(var eleName in this.formElements){
		this.setValue(eleName,null);
	}
};
FormManager.prototype.removeAll = function(){
	this.formElements = {};
};
/**
 * 1、对于checkbox如果需要被选中的话，应该是使用
 * getElement的方法获取到相应的checkbox然后设置其checked属性为真。
 * 当然一般这个工作应该是用户点击。
 * 2、对于QxComboBox，有些难办因为用户程序可能希望使用选项的值为value，
 * 也可能希望是显示的值为value。
 * 
 */
FormManager.prototype.setValue = function(vName,vValue){
	var eles = this.getElement(vName);
	if(eles != null){
		for(var j=0; j<eles.length; j++) {
			var ele = eles[j];
		  if(ele.classname.indexOf('RadioManager') > -1){
		  	var items = ele.getItems();
			for(var i = 0; i < items.length; i++){
				var item = items[i];
				if(item.getValue() == vValue){
					item.setChecked(true);
				  ele.setSelected(item);
				  //return;
				}
			}
		  }else if(ele.classname.indexOf('ComboBox') > -1){
		  	ele.debug("vValue="+vValue);
		  	//如果在所有的item的value里没有找到对应的值，就
		  	//在label里找，否则就直接设为Combobox的值。
		  	var itemList = ele.getList().getChildren();
		  	
		  	if(itemList != null){
		  		var matched = false;
		  		for(var x = 0; x < itemList.length; x++){
		  			var itemx = itemList[x];
		  			var valuex = itemx.getValue();
		  			ele.debug("ele.valuex="+valuex);
		  			if(valuex == vValue){
		  				ele.setSelected(itemx);
		  				matched = true;
		  				break;
		  			}
		  		}
		  		if(!matched){
		  		    for(var x = 0; x < itemList.length; x++){
			  			var itemx = itemList[x];
			  			var labelx = itemx.getLabel();
			  			if(labelx == vValue){
			  				ele.setSelected(itemx);
			  				matched = true;
			  				break;
			  			}
		  		    }
		  		}
		  		if(!matched){
		  			ele.setValue(vValue);
		  		}
		  	}else{
		  		ele.setValue(vValue);
		  	}
		  }else{
		  	  ele.setValue(vValue);
		  }
			
		}
	}
}
FormManager.prototype.add = function(vName,elementObj){
	if(this.formElements[vName] == null){this.formElements[vName] = [];}
  this.formElements[vName].push(elementObj);
};
/**
 * 根据表单元素名称获取表单元素，如果是多个元素具有相同的名称
 * 就再根据元素的值来判断。
 * 如果有多个同名元素，而又没有提供元素值，无法确定元素，
 * 那么就返回元素数组。
 * 如果不存在的话就返回null，否则返回一个数组即便是只有一个。
 */
FormManager.prototype.getElement = function(vName,vValue){
  var eles = this.formElements[vName];
  if(eles == null){return null;}
  var rtn = eles;
  if(vValue != null){
  	rtn = [];
  	for(var i = 0; i < eles.length; i++){
  		var ele = eles[i];
  		if(ele.getValue() == vValue){
  			rtn.push(ele);
  		}
  	}

	rtn = eles;
  }
  return rtn;
};
FormManager.prototype.getElements = FormManager.prototype.getElement;
FormManager.prototype.getFormValues = function(){
  var r = {};
  for(var eleName in this.formElements){
    r[eleName] = this.getValue(eleName);
  }
  return r;
}

/**
----------------------------
使用ajax获取远程的文件内容
----------------------------
*/
/**
 * 正式采用同步方式，也可以直接使用QxRequest来通过异步方式来实现。
 */
function getUrlContent(url){
  var rtn = "";        
  var loader=new qx.io.remote.RemoteRequest(url, "GET", "text/plain");
  loader.setAsynchronous(false);
    loader.addEventListener("completed", function(e)
    {
       rtn = e.getData().getContent();
    });
  loader.send();
  return rtn;
}

/**
-------------------------------------------------
          焦点管理器
          接受管理的点一般的都应该有focus函数。
          由于要统一添加事件响应的方式，所以现在规定只能是qooxdoo的类实例。
-------------------------------------------------
*/
FocusIndexManager = function(){
	this.sequence = [];
	this.switchFun = function(e,currentEle){
		var nextEle = null;
		for(var i = 0; i < this.sequence.length; i++){
			var ele = this.sequence[i];
			if(ele == currentEle){
				if(i == this.sequence.length-1){
					nextEle = this.sequence[0];
				}else{
					nextEle = this.sequence[i+1];
				}
			break;
			}
		}
		try{
		    nextEle.focus();
		}catch(e){
			window.status = e.message;
		}
	};
};
/**
 * 给焦点切换序列添加新的点。
 * 默认的焦点之间的切换是按照顺序循环切换的，如果某个特殊的点，
 * 需要特殊的响应方式就自己指定相应的处理方式。
 */
FocusIndexManager.prototype.add = function(ele,handlerFun){
	var self = this;
	if(handlerFun != null){
		ele.addEventListener('keydown',function(e){handlerFun(e,self)});
	}else{
		ele.addEventListener("keydown",function(e){
			var keyCode = e.getKeyCode();
			if(keyCode == 13){
				try{
				self.switchFun(e,this);
				}catch(e){
					window.status = e.message;
				}
			}
		});
	}
	this.sequence.push(ele);
};
FocusIndexManager.prototype.replace = function(index,ele){
	alert('TODO....');
};
/**
-------------------------------------------------
          WinForm管理器。
          其实就实现来讲，这里的管理实际就是一个登记而以。
          今后这个有可能会做成类似spring的BeanFactory的东西。
-------------------------------------------------
*/
WinFormManager = function(){};
WinFormManager.forms = {};
WinFormManager.add = function(winFormName,winFormConstructor){
	WinFormManager.forms[winFormName] = winFormConstructor;
};
/**
 * 这个是不是有点类装载器的功能。
 */
WinFormManager.get = function(winFormName,jsPath){
	var rtn = WinFormManager.forms[winFormName];
	if(rtn == null && jsPath != null){
		var content = QXDUtil.getUrlContent(jsPath);
		eval(content);//WinFormManager.add has been called.
		rtn = WinFormManager.forms[winFormName];
	}
	return rtn
};
/**
-------------------------------------------------
          BeanUtils有点类似apache的BeanUtils
-------------------------------------------------
*/
BeanUtils = function(){};
BeanUtils.copyProperties = function(dist,src){
	if(dist == null)dist={};
  for(var eleName in src){
    dist[eleName] = src[eleName];
  }
  return dist;
};
BeanUtils.copyToLVItem = function(o1,o2){
  for(var eleName in o2){
  	if(!o1[eleName])o1[eleName]={};
    var v = o2[eleName];
    if(typeof v == 'number'){
    	v = ''+v;
    }
	o1[eleName].text = v;
  }
  return o1;
};
BeanUtils.copyFromLVItem = function(o1,o2){
  for(var eleName in o2){
    o1[eleName] = o2[eleName].text;
  }
  return o1;
};

/**
-------------------------------------------------
          qxUtils全局性的通用方法
-------------------------------------------------
*/
qxUtils = {};
qxUtils.arrangeHorizontal = function(interval,data){
	var preWidget = arguments[1];
	var top = preWidget.getTop();
	for(var i = 2; i < arguments.length; i++){
		var widget = arguments[i];
		var width = preWidget.getWidth();
		var left = preWidget.getLeft();
		widget.setLocation(left+width+interval,top);
		preWidget = widget;
	}
};
qxUtils.arrangeVertical = function(interval,data){
	var preWidget = arguments[1];
	var left = preWidget.getLeft();
	for(var i = 2; i < arguments.length; i++){
		var widget = arguments[i];
		var height = preWidget.getHeight();
		var top = preWidget.getTop();
		widget.setLocation(top+height+interval,left);
		preWidget = widget;
	}
};